/*!
 * \file IHotMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 热门合约管理接口定义
 * \details 定义了热门合约管理模块的核心接口，提供主力合约和次主力合约的查询和管理功能
 */
#pragma once
#include "WTSMarcos.h"
#include <vector>
#include <string>
#include <stdint.h>

/**
 * @struct _HotSection
 * @brief 热门合约时段结构
 * @details 用于存储某个合约在特定时间段内的热门状态信息。
 *          包含合约代码和有效时间范围。
 */
typedef struct _HotSection
{
	std::string	_code;		///< 合约代码
	uint32_t	_s_date;	///< 开始日期，格式为yyyyMMdd
	uint32_t	_e_date;	///< 结束日期，格式为yyyyMMdd

	_HotSection(const char* code, uint32_t sdate, uint32_t edate)
		: _s_date(sdate), _e_date(edate), _code(code)
	{
	
	}

} HotSection;
typedef std::vector<HotSection>	HotSections;

NS_WTP_BEGIN

#define HOTS_MARKET		"HOTS_MARKET"		///< 主力合约市场标识
#define SECONDS_MARKET	"SECONDS_MARKET"	///< 次主力合约市场标识

/**
 * @class IHotMgr
 * @brief 热门合约管理接口
 * @details 热门合约管理模块的核心接口，负责管理主力合约和次主力合约的信息。
 *          主要功能包括：
 *          - 主力合约代码查询和管理
 *          - 次主力合约代码查询和管理
 *          - 热门合约历史时段分割
 *          - 合约热门状态判断
 *          
 *          在期货交易中，主力合约通常是成交量和持仓量最大的合约，
 *          次主力合约是仅次于主力合约的活跃合约。该接口提供了
 *          完整的热门合约管理功能，支持历史查询和时段分析。
 */
class IHotMgr
{
public:
	/**
	 * @brief 获取主力合约代码
	 * @details 根据交易所、品种代码和日期获取对应的主力合约代码。
	 * 
	 * @param exchg 交易所代码
	 * @param pid 品种代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 主力合约代码，失败返回nullptr
	 */
	virtual const char* getRawCode(const char* exchg, const char* pid, uint32_t dt)	= 0;

	/**
	 * @brief 获取指定日期前一个交易日的主力合约代码
	 * @details 获取在指定日期之前最近一个交易日的主力合约的原始代码。
	 *          用于获取历史主力合约信息。
	 * 
	 * @param exchg 交易所代码
	 * @param pid 品种代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 前一交易日主力合约代码，失败返回nullptr
	 */
	virtual const char* getPrevRawCode(const char* exchg, const char* pid, uint32_t dt) = 0;

	/**
	 * @brief 获取热门合约标识
	 * @details 根据原始合约代码和日期获取对应的热门合约标识代码。
	 * 
	 * @param exchg 交易所代码
	 * @param rawCode 原始合约代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 热门合约标识代码，失败返回nullptr
	 */
	virtual const char* getHotCode(const char* exchg, const char* rawCode, uint32_t dt) = 0;

	/**
	 * @brief 判断是否为主力合约
	 * @details 判断指定的原始合约代码在给定日期是否为主力合约。
	 * 
	 * @param exchg 交易所代码
	 * @param rawCode 原始合约代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return bool true表示是主力合约，false表示不是主力合约
	 */
	virtual bool		isHot(const char* exchg, const char* rawCode, uint32_t dt) = 0;

	/**
	 * @brief 分割主力合约时段
	 * @details 将主力合约在某个时间段的分段合约全部数据获取出来。
	 *          用于分析主力合约在不同时期的变化情况。
	 * 
	 * @param exchg 交易所代码
	 * @param hotCode 热门合约代码
	 * @param sDt 开始日期，格式为yyyyMMdd
	 * @param eDt 结束日期，格式为yyyyMMdd
	 * @param sections 输出参数，存储分割后的时段信息
	 * @return bool true表示分割成功，false表示分割失败
	 */
	virtual bool		splitHotSecions(const char* exchg, const char* hotCode, uint32_t sDt, uint32_t eDt, HotSections& sections) = 0;

	/**
	 * @brief 获取次主力合约代码
	 * @details 根据交易所、品种代码和日期获取对应的次主力合约代码。
	 * 
	 * @param exchg 交易所代码
	 * @param pid 品种代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 次主力合约代码，失败返回nullptr
	 */
	virtual const char* getSecondRawCode(const char* exchg, const char* pid, uint32_t dt) = 0;

	/**
	 * @brief 获取指定日期前一个交易日的次主力合约代码
	 * @details 获取在指定日期之前最近一个交易日的次主力合约的原始代码。
	 *          用于获取历史次主力合约信息。
	 * 
	 * @param exchg 交易所代码
	 * @param pid 品种代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 前一交易日次主力合约代码，失败返回nullptr
	 */
	virtual const char* getPrevSecondRawCode(const char* exchg, const char* pid, uint32_t dt) = 0;

	/**
	 * @brief 获取次主力合约标识
	 * @details 根据原始合约代码和日期获取对应的次主力合约标识代码。
	 * 
	 * @param exchg 交易所代码
	 * @param rawCode 原始合约代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return const char* 次主力合约标识代码，失败返回nullptr
	 */
	virtual const char* getSecondCode(const char* exchg, const char* rawCode, uint32_t dt) = 0;

	/**
	 * @brief 判断是否为次主力合约
	 * @details 判断指定的原始合约代码在给定日期是否为次主力合约。
	 * 
	 * @param exchg 交易所代码
	 * @param rawCode 原始合约代码
	 * @param dt 日期，格式为yyyyMMdd
	 * @return bool true表示是次主力合约，false表示不是次主力合约
	 */
	virtual bool		isSecond(const char* exchg, const char* rawCode, uint32_t dt) = 0;

	/**
	 * @brief 分割次主力合约时段
	 * @details 将次主力合约在某个时间段的分段合约全部数据获取出来。
	 *          用于分析次主力合约在不同时期的变化情况。
	 * 
	 * @param exchg 交易所代码
	 * @param hotCode 次主力合约代码
	 * @param sDt 开始日期，格式为yyyyMMdd
	 * @param eDt 结束日期，格式为yyyyMMdd
	 * @param sections 输出参数，存储分割后的时段信息
	 * @return bool true表示分割成功，false表示分割失败
	 */
	virtual bool		splitSecondSecions(const char* exchg, const char* hotCode, uint32_t sDt, uint32_t eDt, HotSections& sections) = 0;
};
NS_WTP_END
